package cn.edu.lzzy.aspects;

import cn.edu.lzzy.entities.Messages;
import cn.edu.lzzy.entities.User;
import cn.edu.lzzy.utils.AspectUtils;
import cn.edu.lzzy.utils.AuthUtils;
import cn.edu.lzzy.vm.JSONResult;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
/**
 * 切面编程
 */
public class AdminControllerAspect {
    //Aspect 标注的类种，通过@Pointcut 定义切入点
    //@Pointcut指定拦截的范围
    @Pointcut("execution(* cn.edu.lzzy.controllers.admin.*.*(..))")//切入点范围
    private void adminAspect(){

    }

    /***
     *
     * @Around:可以在目标方法之前、之后织入动作
     * 可以确定目标方法何时执行，怎么执行，甚至阻止执行。
     * @Around需要在线程安全环境下使用，如果是Before、AfterReturing 增强方法可以解决的事，不需要使用Around完成
     * 在切入点方法之前进行权限检查
     */
    @Around("adminAspect()")
    public JSONResult aroundAdminController(ProceedingJoinPoint point)throws Throwable{
      String token = AspectUtils.getArgToken(point);
      if(AuthUtils.illegalUser(token,new int[]{User.TYPE_ADMIN})){
          return new JSONResult(403,null, Messages.NO_PERMISSION.toString());
      }
      return (JSONResult) point.proceed();

    }
}
